#include <linux/init.h>         //包含宏定义得头文件
#include <linux/module.h>       //包含初始化加载模块得头文件
#include <linux/kdev_t.h>       //处理设备号宏定义的头文件
#include <linux/fs.h>           //文件操作集
#include <linux/uaccess.h>      //copy_to_user函数的文件
#include <linux/io.h>           //ioermap等函数的头文件
#include <linux/of.h>           //设备树of操作函数头文件
// #include <linux/cdevdevice.h>   //杂项设备头文件
/*包含头文件*/
/************************
*
*
*（1）
*（2）
*（3）
*（4）
*（5）
*（6）
* (7)注意点：
***********************************************************************/
/*全局变量*/
int size;
u32 out_values[2]={0};
const char *str;
struct device_node*test_device_node;
struct property*property_test;
/*功能实现*/
static int hello_init(void)
{
    int ret;
#if 0
    int plat_reg=0;
    plat_reg =platform_driver_register(&beep_driver);
    if(plat_reg<0){
        printk("platform_driver_register error!\n");
    }
    printk("platform_driver_register ok!\n");
#endif
    printk("hello world ok!\n");
/*查找需要查找的设备树中的节点*/
    test_device_node=of_find_node_by_path("/test");//获取节点的信息，/test取绝对路径
        if(test_device_node==NULL)
        {
            printk("test_device_node error!\n");
            return -1;
        }
    printk("test_device_node name is %s",test_device_node->name);
//获取到节点中的指定属性compatible属性
    property_test=of_find_property(test_device_node,"compatible",&size);
        if(property_test==NULL)
        {
            printk("of_find_property error!\n");
            return -1;
        }
    printk("property_test name is %s",property_test->name);
/*获取到节点中的指定属性reg属性*/
    ret=of_property_read_u32_array(test_device_node,"reg",out_values,2);
        if(ret<0)
        {
            printk("of_property_read_u32_array error!\n");
            return -1;
        }
    printk("out_values[0] is 0x%08x\n",out_values[0]);
/*获取status属性内容*/
    ret=of_property_read_string(test_device_node,"status",str);
        if(ret<0)
            {
                printk("of_property_read_string error!\n");
                return -1;
            }
    printk("status is:%s\n",str);   
    return 0;
}

static void beep_driver_exit(void)//退出函数没有返回值
{
    platform_driver_unregister(&beep_driver);
    printk("byb byb !");  
}     


module_init(beep_driver_init);
module_exit(beep_driver_exit); 
/*驱动的出口与入口函数都在此处*/
MODULE_LICENSE("GPL");
/*申明信息*/
	
/*注意在开发板中加载驱动的时候一定要保持板卡的内核和编译的内核是一致的否则会报错
*查看设备节点：ls /dev/hello_cdev
*/


